import { readFile } from 'node:fs/promises'
import uni from '@uni-helper/eslint-config'
import globals from 'globals'

const autoImportFile = new URL('./.eslintrc-auto-import.json', import.meta.url)
const autoImportGlobals = JSON.parse(await readFile(autoImportFile, 'utf8'))

export default uni({
  // @stylistic/eslint-plugin-plus
  stylistic: true,
  // eslint-plugin-format
  formatters: true,
  // unocss 检测&格式化
  unocss: true,
  // vue的eslint配置
  vue: true,
  // 保存删除未引入的代码
  // isInEditor: false,
  typescript: true,
  // 9x版本 忽略文件这种配置方式 废弃掉eslintignore
  ignores: [
    '*.sh',
    '/env/.env',
    '/env/.env.development',
    '/env/.env.production',
    '*.md',
    '*.woff',
    '*.ttf',
    '.idea',
    '/public',
    '/docs',
    '.husky',
    '.local',
    '/bin',
    'Dockerfile',
    'webpack.config.*',
    'tsconfig.json',
    'vite-plugins/*.*',
    'vite.config.ts',
    '**/postupgrade.*',
    '.node-version',
    '.npmrc',
    'pnpm-lock.*',
    '*.mdc',
    '**/uni_modules/lime-echart/**/*.*',
  ],
}, {
  languageOptions: {
    // 指定全局变量
    globals: {
      ...globals.browser, // 浏览器环境
      ...globals.node, // node 环境
      ...autoImportGlobals.globals, // 自动导入配置
      $t: true,
      uni: true,
      wx: true,
      assets: true,
      UniApp: true,
      WechatMiniprogram: true,
      getCurrentPages: true,
      UniHelper: true,
      Page: true,
      App: true,
      NodeJS: true,
    },
    // parser: tsParser,
    ecmaVersion: 'latest',
    sourceType: 'module',
  },
}, {
  // Without `files`, they are general rules for all files
  rules: {
    // 该规则禁止使用无限制的 eslint-disable 注释，即不指定具体规则名的 eslint-disable。无限制禁用可能会掩盖其他潜在的问题。
    'eslint-comments/no-unlimited-disable': 'off',
    // TypeScript 允许在定义之前使用变量或函数，但此规则禁止这样做，确保代码的可读性和可维护性。
    'ts/no-use-before-define': ['error'],
    'no-console': 'off',
    'ts/no-unused-expressions': 'off',
    // 该规则限制每行代码中语句的最大数量，以提高代码的可读性。
    'style/max-statements-per-line': 'off',
    // 此规则建议使用 namespace 关键字而不是 module 关键字来定义命名空间。
    'ts/prefer-namespace-keyword': 'off',
    'antfu/top-level-function': 'off',
    // 该规则建议优先使用全局的 process 对象，而不是从 node:process 导入。
    'node/prefer-global/process': 'off',
    // 此规则要求在定义类型时保持一致性，比如要么都用 interface，要么都用 type。
    'ts/consistent-type-definitions': 'warn',
    // 该规则禁止使用 // @ts-ignore、// @ts-nocheck 等 TypeScript 注释，因为这些注释可能会掩盖潜在的类型错误。
    'ts/ban-ts-comment': 'off',
    // 该规则强制单标签 HTML 元素的内容换行，设置为 off 表示关闭此规则。
    'vue/singleline-html-element-content-newline': 'off', // vue 标签强制换行
    // 关闭一些耗时的规则
    'import/no-cycle': 'off',
    // 该规则禁止导入已弃用的模块或 API。
    'import/no-deprecated': 'off',
    // 此规则禁止将命名导出作为默认导入
    'import/no-named-as-default': 'off',
    // 该规则建议在 Promise.reject 中使用 Error 对象，而不是其他类型的值。
    'prefer-promise-reject-errors': 'off',
    // 和下面这个重复了。关闭一个
    'unused-imports/no-unused-vars': 'off',
    // _开头变量么有使用也不会报错
    'ts/no-unused-vars': ['warn', {
      argsIgnorePattern: '^_',
      varsIgnorePattern: '^_',
    }],
    // 该规则禁止在表达式中混合使用不同优先级的运算符，除非使用括号明确优先级。
    'style/no-mixed-operators': 'off',
    // 多行的时候必须要逗号结束
    'style/comma-dangle': ['error', 'always-multiline'],
    // 对象双引号规则，特殊的字符才需要
    'style/quote-props': ['error', 'as-needed'],
    // vue 组件必须多单词驼峰命名，关闭它
    'vue/multi-word-component-names': 'off',
    // 此规则用于检查 import 语句引入的模块是否存在，将其关闭后，即使引入的模块不存在，ESLint 也不会报错。
    'import-x/no-unresolved': 'off',
    // 该规则禁止在 TypeScript 代码中显式使用 any 类型，将其关闭后，允许使用 any 类型。
    'ts/no-explicit-any': 'off',
    // 该规则禁止在 TypeScript 中使用 require 进行模块导入，关闭后允许使用 require。
    'ts/no-require-imports': 'warn',
    // 禁止变量重新声明，与 @typescript-eslint 重复提示了，关闭它
    'no-redeclare': 'off',
    // 禁止变量重新声明
    'ts/no-redeclare': 'error',
    'style/brace-style': 'off',
    eqeqeq: 'warn',
    // 有一些老代码没有写好注解，先关闭了
    'jsdoc/require-returns-description': 'off',
    'jsdoc/check-param-names': 'off',
  },
})
